// File: jmcomic-core/src/main/java/dev/jukomu/jmcomic/util/PatternUtils.java
package dev.jukomu.jmcomic.util;

import dev.jukomu.jmcomic.exception.JmcomicException;
import dev.jukomu.jmcomic.exception.RegularNotMatchException;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 对应Python的PatternTool，提供正则表达式匹配工具。
 */
public class PatternUtils {

    /**
     * 尝试匹配HTML，如果匹配成功返回指定组的内容，否则返回默认值。
     * 对应Python的match_or_default。
     *
     * @param html         HTML字符串
     * @param pattern      正则表达式模式
     * @param defaultValue 默认值
     * @return 匹配到的内容或默认值
     */
    public static String matchOrDefault(String html, Pattern pattern, String defaultValue) {
        if (html == null || pattern == null) {
            return defaultValue;
        }
        Matcher matcher = pattern.matcher(html);
        if (matcher.find()) {
            // Python的group(1)通常是第一个捕获组
            return matcher.groupCount() >= 1 ? matcher.group(1) : matcher.group(0);
        }
        return defaultValue;
    }

    /**
     * 要求HTML必须匹配指定模式，否则抛出异常。
     * 对应Python的require_match。
     *
     * @param html       HTML字符串
     * @param pattern    正则表达式模式
     * @param msg        错误消息
     * @param groupIndex 捕获组索引，默认为1
     * @return 匹配到的内容
     * @throws RegularNotMatchException 如果不匹配
     */
    public static String requireMatch(String html, Pattern pattern, String msg, int groupIndex) {
        Map<String, Object> context = new HashMap<>();
        context.put("html", html);
        context.put("pattern", pattern);
        if (html == null || pattern == null) {
            throw new RegularNotMatchException(msg, context);
        }
        Matcher matcher = pattern.matcher(html);
        if (matcher.find()) {
            return matcher.group(groupIndex);
        }
        throw new RegularNotMatchException(msg, context);
    }

    /**
     * 要求HTML必须匹配指定模式，否则抛出异常。使用默认捕获组1。
     *
     * @param html    HTML字符串
     * @param pattern 正则表达式模式
     * @param msg     错误消息
     * @return 匹配到的内容
     * @throws RegularNotMatchException 如果不匹配
     */
    public static String requireMatch(String html, Pattern pattern, String msg) {
        return requireMatch(html, pattern, msg, 1);
    }

    /**
     * 要求HTML不能匹配指定模式，否则抛出异常。
     * 对应Python的require_not_match。
     *
     * @param html    HTML字符串
     * @param pattern 正则表达式模式
     * @param msgFunc 错误消息生成函数，接收Matcher作为参数
     * @throws JmcomicException 如果匹配成功
     */
    public static void requireNotMatch(String html, Pattern pattern, Function<Matcher, String> msgFunc) {
        if (html == null || pattern == null) {
            return; // Cannot match if input is null
        }
        Matcher matcher = pattern.matcher(html);
        if (matcher.find()) {
            String msg = msgFunc != null ? msgFunc.apply(matcher) : "Unexpected pattern matched.";
            Map<String, Object> context = new HashMap<>();
            context.put("html", html);
            context.put("pattern", pattern.pattern());
            throw new JmcomicException(msg, context);
        }
    }

    /**
     * 创建用于异常上下文的Map。
     *
     * @param html    HTML内容
     * @param pattern 正则表达式模式
     * @return Map
     */
    private static Map<String, Object> createContext(String html, Pattern pattern) {
        Map<String, Object> context = new HashMap<>();
        context.put("html", html);
        context.put("pattern", pattern.pattern());
        return context;
    }

    // 私有构造函数，防止实例化
    private PatternUtils() {
    }
}